/**************************************************************************//**
 * @item     CosyOS-III 例程（服务应用）
 * @file     coop_ressus_2.c
 * @brief    协作_恢复挂起二
 * @details  通过{恢复、挂起}相关操作，实现任务的循环协作。
 * @note     适用于多个不同优先级任务的循环协作。
 * @author   迟凯峰
 * @version  V1.0.0
 * @date     2025.10.21
 ******************************************************************************/

/*----------------------------------------------------------*
 | 服务                 | 描述                              |
 |----------------------+-----------------------------------|
 | uResumeSuspend(task) | 任务中 恢复指定任务并挂起自身任务 |
 *----------------------------------------------------------*/

#if 1 /* 编译开关 */

#include "CosyOS.H"

/* task_1 */
uCreateTask(task_1, 3, 384, 0, 0)
{
    uExternTask(task_2);
    while(1){
        /* 协作处理事务 开始 */
        
        /* 协作处理事务 结束 */
        /* 同步至task_2 开始 */
        uResumeSuspend(task_2); // 恢复task_2并挂起自身 -> 立即触发任务调度
        /* 同步至task_2 结束 */
    }
}

/* task_2 */
uCreateTask(task_2, 2, 384, 0, 0)
{
    uExternTask(task_3);
    while(1){
        /* 协作处理事务 开始 */
        
        /* 协作处理事务 结束 */
        /* 同步至task_3 开始 */
        uResumeSuspend(task_3); // 恢复task_3并挂起自身 -> 立即触发任务调度
        /* 同步至task_3 结束 */
    }
}

/* task_3 */
uCreateTask(task_3, 1, 384, 0, 0)
{
    while(1){
        /* 协作处理事务 开始 */
        
        /* 协作处理事务 结束 */
        /* 同步至task_1 开始 */
        uResumeSuspend(task_1); // 恢复task_1并挂起自身 -> 立即触发任务调度
        /* 同步至task_1 结束 */
    }
}

/* 启动钩子 */
void start_hook(void)
{
    uStartTask_Ready(task_1); // 启动task_1，初始状态为就绪状态
    uStartTask_Ready(task_2); // 启动task_2，初始状态为就绪状态
    uStartTask_Ready(task_3); // 启动task_3，初始状态为就绪状态
}

#endif
